using System;
using System.Collections.Generic;
using System.Text;

namespace PloobsEngine.MessageSystem
{
 /// <summary>
 /// Mensagem a ser enviada
 /// </summary>
    public class Message
    {
        private Checks check = Checks.DONT_CHECK_DELIVERY;

        public Checks Check
        {
            get { return check; }
            set { check = value; }
        }

        private int sender;

        public int Sender
        {
            get { return sender; }
            set { sender = value; }
        }
        private int receiver;

        public int Receiver
        {
            get { return receiver; }
            set { receiver = value; }
        }
        private string tag;

        public string Tag
        {
            get { return tag; }
            set { tag = value; }
        }
        private Priority prioridade;

        public Priority Prioridade
        {
            get { return prioridade; }
            set { prioridade = value; }
        }
        private double timetodeliver;

        public double Timetodeliver
        {
            get { return timetodeliver; }
            set { timetodeliver = value; }
        }
        private SenderType type;

        public SenderType SenderType
        {
            get { return type; }
            set { type = value; }
        }
        private Object content; //consertar , mas n sei como mas n poderia ser object aqui , em c++ eu usaria um void pointer ....

        public Object Content
        {
            get { return content; }
            set { content = value; }
        }
        private string cod;

        public string Cod
        {
            get { return cod; }
            set { cod = value; }
        }

        /// <summary>
        /// Mensagem q pode ser trocada entre entidades
        /// </summary>
        /// <param name="sender">Id do sender, usar -1 para um sender nao identificado</param>
        /// <param name="receiver">Id do reciver, usar -1 para enviar para um canal</param>
        /// <param name="tag">tag (para enviar para um grupo de agentes) , se for para um so, usar null</param>
        /// <param name="pri">prioridade (ver enum)</param>
        /// <param name="timetodeliver">daqui a quanto tempo enviar ( usar zero para enviar neste frame e -1 para enviar IMEDIATAMENTE) - EM MILISEGUNDOOOOOOS</param>
        /// <param name="type">Tipo da mensagem (ver enum) -> A engine nao usa este campo para nada, serve apenas para o usuario saber o tipo de entidade q enviou a mensagem</param>
        /// <param name="Content">Conteudo</param>
        /// <param name="cod">Codigo da mensagem, uso exclusivo do usuario, o sistema nao ve este parametro</param>
        public Message(int sender, int receiver, string tag , Priority pri , int timetodeliver , SenderType type ,Object Content, string cod)
        {
            this.sender = sender;
            this.receiver = receiver;
            this.tag = tag;
            this.prioridade = pri;
            this.timetodeliver = timetodeliver;
            this.type = type;
            this.content = Content;
            this.cod = cod;
        }

    }
    public enum Priority
    {
       URGENT = 10 , HIGH  = 5, MEDIUM = 3 , LOW = 2 , VERYLOW = 0

    }
    /// <summary>
    /// Por enquanto esta estatico, mas deveria algo q o usuario poderia adicionar mais
    /// tipos de mensagens sem mexer diretamente aqui
    /// </summary>
    public enum SenderType
    {
        SYSTEM = 0 , NORMAL , IA ,HUD,SOUND,EVENT,MAIL,OBJECT
    }

    public enum Checks
    {
        CHECK_DELIVERY,DONT_CHECK_DELIVERY
    }

     

}
